import { ActionFormData } from "@minecraft/server-ui";
import { system } from "@minecraft/server";


export default class BtnUI {

    /**
     * 玩家
     * @type {import("@minecraft/server").Player}
     */
    __player


    /**
     * 标题
     * @type {import("@minecraft/server-ui").ActionFormData}
     */
    __form


    /**
     * 标题
     * @type {string}
     */
    __Title = "未定义"


    /**
     * 
     * @type {string}
     */
    __Body = ""


    /**
     * 按钮列表
     * @type {{ text: any; icon: any; func: any;}[]}
     */
    __BtnList = []


    /**
     * 玩家繁忙时重复触发的间隔(单位: gametick)
     * @type {number}
     */
    __busy_wait = 1


    /**
    * @param {import("@minecraft/server").Player} player
    */
    constructor(player) {
        // 初始化 玩家对象 和 表单对象
        this.__player = player
        this.__form = new ActionFormData()
    }


    /**
     * 添加按钮
     * @param {string} text
     * @param {string} icon_path
     * @param {Function} func
     */
    add_btn(text, icon_path, func) {
        // 添加按钮对象到数组
        this.__BtnList.push({
            "text": text,
            "icon": icon_path,
            "func": func
        })

        return this;
    }


    /**
     * 创建表单并显示
     */
    show() {
        // 添加 title 和 body
        this.__form
            .title(this.__Title)
            .body(this.__Body)

        // 添加按钮到表单
        for (let index = 0; index < this.__BtnList.length; index++) {
            const btn = this.__BtnList[index]
            this.__form.button(btn.text, btn.icon)
        }

        // 显示表单并处理回调
        this.show_out()

        return this;
    }


    /**
     * 显示表单并完成逻辑
     */
    show_out() {
        // 显示表单
        this.__form.show(this.__player).then(result => {
            // 当取消表单原因为 UserClosed 时正常关闭表单
            if (result.cancelationReason === "UserClosed") {
                this.__player.sendMessage("§c菜单已取消");
                return
            } else {
                // 当用户点击按钮后
                if (result.selection >= 0) {
                    // 按索引找到按钮对象
                    let { func } = this.__BtnList[result.selection]
                    // 执行函数
                    func()
                    return
                } else {
                    // 当表单显示失败时重复执行
                    system.runTimeout(() => {
                        this.show_out()
                    }, this.__busy_wait)
                }
            }

        })
    }
}